{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# ch3.3编程实现对率回归\n",
    "编程实现对率回归，并给出西瓜数据集3.0alpha上的结果"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "from numpy import linalg\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn import model_selection\n",
    "from sklearn.linear_model import LogisticRegression\n",
    "\n",
    "# formula 3.27\n",
    "def loglikelihood(x,y,beta):\n",
    "    sum_ll = 0\n",
    "    for i in range(x.shape[1]):\n",
    "        x1 = np.reshape(x[:,i],[len(x),1])\n",
    "        beta_x = float(np.dot(beta.T,x1))\n",
    "        sum_ll += -y[i]*beta_x + np.log(1+np.exp(beta_x))\n",
    "    return sum_ll\n",
    "\n",
    "# formula 3.30, 3.31\n",
    "def derivation(x,y,beta):\n",
    "    num_features = x.shape[0]\n",
    "    dbeta = np.zeros([num_features])\n",
    "    d2beta = np.zeros([num_features, num_features])\n",
    "    for i in range(len(y)):\n",
    "        e_beta = float(np.exp(np.dot(beta.T, x[:,i])))\n",
    "        p1 = e_beta/(1+e_beta)\n",
    "        dbeta -= x[:,i]*(y[i]-p1)\n",
    "        x1 = np.reshape(x[:,i],[len(x[:,i]),1])\n",
    "        x2 = np.dot(x1,x1.T)\n",
    "        d2beta += x2*p1*(1-p1)\n",
    "    return np.reshape(dbeta,[len(dbeta),1]),d2beta\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "def get_x_y(x,y):\n",
    "    plt_x0 = []\n",
    "    plt_y0 = []\n",
    "    plt_x1 = []\n",
    "    plt_y1 = []\n",
    "    for i in range(len(y)):\n",
    "        if y[i] == 0:\n",
    "            plt_x0.append(x[i,0])\n",
    "            plt_y0.append(x[i,1])\n",
    "        if y[i] == 1:\n",
    "            plt_x1.append(x[i,0])\n",
    "            plt_y1.append(x[i,1])\n",
    "    return plt_x0, plt_y0, plt_x1, plt_y1\n",
    "\n",
    "def plot_boundary(x,y,x_train, y_train, x_test, y_test, beta):\n",
    "    xx, yy = np.meshgrid(np.arange(min(x[:,0])-0.1, max(x[:,0])+0.1, 0.01),\n",
    "                         np.arange(min(x[:,1])-0.1, max(x[:,1])+0.1, 0.01))\n",
    "    zz = beta[0]*xx + beta[1]*yy + beta[2]\n",
    "    f1 = plt.figure(1)   \n",
    "    plt.title('watermelon_3a')  \n",
    "    plt.xlabel('density')  \n",
    "    plt.ylabel('ratio_sugar')  \n",
    "    plt.contourf(xx,yy,zz)  \n",
    "    plt_x0, plt_y0, plt_x1, plt_y1 = get_x_y(x_train, y_train)\n",
    "    plt_xt0, plt_yt0, plt_xt1, plt_yt1 = get_x_y(x_test, y_test)\n",
    "    plt.scatter(plt_x0, plt_y0, marker = 'o', color = 'red', s=30, label = 'train_bad')\n",
    "    plt.scatter(plt_x1, plt_y1, marker = 'o', color = 'g', s=30, label = 'train_good')\n",
    "    plt.scatter(plt_xt0, plt_yt0, marker = 'x', color = 'red', s=30, label = 'test_bad')\n",
    "    plt.scatter(plt_xt1, plt_yt1, marker = 'x', color = 'g', s=30, label = 'test_good')\n",
    "    plt.legend(loc = 'upper right')\n",
    "    plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 读取，划分数据集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "dataset = np.loadtxt('data/watermelon_3_0_alpha.txt',delimiter=',')\n",
    "x = dataset[:,1:3]\n",
    "num_features = x.shape[1]\n",
    "x = np.insert(x,2,values=1,axis=1)\n",
    "x = x\n",
    "y = dataset[:, 3]\n",
    "x_train, x_test, y_train, y_test = model_selection.train_test_split(x, y, test_size=0.5, random_state=0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 牛顿迭代法的结果"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "19 [[ -85.35092276]\n",
      " [ 390.44165894]\n",
      " [ -27.50567487]]\n"
     ]
    }
   ],
   "source": [
    "beta = np.zeros([num_features+1,1])\n",
    "beta[2] = 1\n",
    "\n",
    "n_iter = 100\n",
    "ll_old = 0\n",
    "for i in range(n_iter):\n",
    "    ll = loglikelihood(x_train.T,y_train.T,beta)    \n",
    "    if np.abs(ll-ll_old) <= 0.0000001:\n",
    "        break\n",
    "    ll_old = ll\n",
    "    dbeta, d2beta = derivation(x_train.T,y_train.T,beta)\n",
    "    # formula 3.29\n",
    "    beta = beta - np.dot(linalg.inv(d2beta), dbeta)\n",
    "print(i, beta)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0xcfbf28ddd8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plot_boundary(x,y,x_train, y_train, x_test, y_test, np.ravel(beta))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 调用sklearn库的结果"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[-0.0825445   0.39557096 -0.01393502]]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\ngg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0xcfbef0ef60>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "log_model = LogisticRegression() \n",
    "log_model.fit(x_train, y_train) \n",
    "print(log_model.coef_)\n",
    "plot_boundary(x,y,x_train, y_train, x_test, y_test, np.ravel(log_model.coef_))"
   ]
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python [conda root]",
   "language": "python",
   "name": "conda-root-py"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
